﻿using System;
using System.IO;
using System.Data.SqlServerCe;

namespace MoroMoro.Samples.ToDoList.Persistence
{
    /// <summary>
    /// SQL Server CE 4.0 の接続文字列を表します。
    /// </summary>
    [Serializable]
    internal sealed class ConnectionString
    {
        /// <summary>
        /// <see cref="ConnectionString"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="directoryPath">ディレクトリのパス。</param>
        /// <param name="fileName">データベースファイルの名前。</param>
        /// <exception cref="System.ArgumentException">directoryPath または fileName が無効な文字を含んでいます。</exception>
        /// <exception cref="System.ArgumentNullException">directoryPath または fileName が null です。</exception>
        public ConnectionString(string directoryPath, string fileName)
        {
            DirectoryPath = directoryPath;
            FileName = fileName;
            FilePath = Path.Combine(directoryPath, fileName);
        }


        /// <summary>
        /// ディレクトリのパス。
        /// </summary>
        public readonly string DirectoryPath;

        /// <summary>
        /// データベースファイルの名前。
        /// </summary>
        public readonly string FileName;

        /// <summary>
        /// データベースファイルのパス。
        /// </summary>
        public readonly string FilePath;


        /// <summary>
        /// SQL Server CE 4.0 接続文字列を取得します。
        /// </summary>
        /// <returns>SQL Server CE 4.0 接続文字列。</returns>
        public override string ToString()
        {
            var builder = new SqlCeConnectionStringBuilder();
            builder.DataSource = FilePath;
            return builder.ToString();
        }

        /// <summary>
        /// <see cref="ConnectionString"/> から <see cref="string"/> への暗黙的な型変換を行います。
        /// </summary>
        /// <param name="obj"><see cref="ConnectionString"/>。</param>
        /// <returns>SQL Server CE 4.0 接続文字列。</returns>
        public static implicit operator string(ConnectionString obj)
        {
            if (obj == null)
            {
                return null;
            }
            return obj.ToString();
        }
    }
}
